package cn.enited.devtools.apiaggregator.api.vo;

import cn.enited.devtools.apiaggregator.api.utils.TripletHashMap;
import cn.enited.devtools.apiaggregator.api.utils.TripletMap;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.*;

@Data
@Accessors(chain = true)
public class RemoteService implements Serializable {
    private static final long serialVersionUID = 5903890444321427970L;

    private String id;

    private String path;
    /**
     * path中的参数和分析结果
     * key: 全变量名，也就是{xxxx}中的xxxx
     * value: 对key分析的结果
     */
    private Map<String, ApiParameter> pathVariableParameters;

    private String method;

    /**
     * 取自ApiAggObject.Entry.dataType: json or form
     */
    private String dataType;

    /**
     * header参数分析结果
     * key: header参数名
     * value1: 全变量名，也就是{xxxx}中的xxxx
     * value2: 对value1分析的结果
     */
    private TripletMap<String, String, ApiParameter> headerParameters;

    /**
     * 从ApiAggObject.data转换过来的原始对象，相当于函数的形参
     */
    private JSONObject primitiveRequestBody;

    /**
     * 对primitiveRequestBody进行分析后的参数结果，由于requestBody可能是JSON对象因此不能像header那样直接使用TripletMap存储，
     * 而是要配合primitiveRequestBody进行操作
     * key: 全变量名，也就是primitiveRequestBody这个原始对象中配置的参数类型的值
     * value: 对key分析的结果
     */
    private Map<String, ApiParameter> requestBodyParameters;

    /**
     * 依赖的service id
     */
    private Set<String> dependServiceIds;

    public RemoteService() {
        this.pathVariableParameters = new HashMap<>();
        this.headerParameters = new TripletHashMap<>();
        this.requestBodyParameters = new HashMap<>();
        this.dependServiceIds = new HashSet<>();
    }

    public RemoteService(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        RemoteService that = (RemoteService) o;
        return Objects.equals(id, that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
